package com.majiang.majiang.util;

import com.majiang.majiang.domain.MaJiang;
import com.majiang.majiang.domain.MaJiangNumber;
import com.majiang.majiang.domain.MaJiangWind;

import java.util.*;

/**
 *
 * @author Administrator
 * 麻将的工厂类，所有麻将必须通过这个类进行实例化
 */
public class MaJiangFactory {
    /**
     * 通过这个方法创建一张麻将
     * @param type 类型
     */
    private MaJiang createMaJiang(int type){
        //一次只允许创建一张麻将
        MaJiang maJiang;
        if (type <= 3) {
            maJiang = new MaJiangNumber();
            maJiang.setType(type);
        }else {
            maJiang = new MaJiangWind();
            maJiang.setType(type);
        }
        return maJiang;
    }

    public List<MaJiang> createMaJiang(Map<Integer, MaJiang> map){
        Set<MaJiang> set = new HashSet<>();
        List<MaJiang> resultList = new ArrayList<>();
        //循环中的i用来把1到10代表的牌填入数组
        for (int i = 1; i <= 10 ; i++) {
            //对万、条、筒进行填入
            if (i <= 3) {
                //循环中的j用来存字牌的数值
                for (int j = 1; j <= 9; j++) {
                    //循环中的g表示每种字牌有4张
                    for (int g = 1; g <= 4; g++) {
                        MaJiangNumber maJiangNumber = (MaJiangNumber) createMaJiang(i);
                        maJiangNumber.setNumber(j);
                        maJiangNumber.setCode(i * 10 + j);
                        resultList.add(maJiangNumber);
                        set.add(maJiangNumber);
                    }
                }
                //对 东、南、西、北、中、发、白进行填入
            }else {
                //循环中的g表示每种风牌有4张
                for (int g = 1; g <= 4; g++) {
                    MaJiangWind maJiangWind = (MaJiangWind) createMaJiang(i);
                    maJiangWind.setCode(i * 10);
                    resultList.add(maJiangWind);
                    set.add(maJiangWind);
                }
            }
        }
        for(MaJiang maJiang: set){
            map.put(maJiang.getCode(), maJiang);
        }
        return resultList;
    }
}
